package com.iris.live.services.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * @Description:
 * @author: Tony.Zhang
 * @Date: 2017-03-16 14:10
 **/
public class NumberUtils {
    private static final Logger logger = LoggerFactory.getLogger(NumberUtils.class);

    private static DecimalFormat df_2 = new DecimalFormat("0.00");

    /**
     * 判断字符串是否是浮点型数字
     * @param value
     * @return
     */
    public static boolean isDouble(Object value){
        if(value == null) {
            return false;
        } else {
            String sValue = value.toString();
            int sz = sValue.length();

            for(int i = 0; i < sz; ++i) {
                if(!Character.isDigit(sValue.charAt(i)) && sValue.charAt(i) != '.') {
                    return false;
                }
            }

            return true;
        }
    }

    public static boolean isNumeric(Object value){
        if(value == null) return false;

        return org.apache.commons.lang3.StringUtils.isNumeric(value.toString());
    }

    public static double roundInt(String value){
        return round(value, 0);
    }

    public static double roundInt(double value){
        return round(value, 0);
    }

    public static String format(double value, int precious){
        return String.valueOf(round(value, precious));
    }

    public static double round(String value, int precious){
        try {
            if(StringUtils.isNullOrBlank(value)) {
                return 0;
            }

            return round(Double.valueOf(value), precious);
        }catch(Exception exc){
            logger.warn("值=" + value + ", 精度=" + precious, exc);

            return 0.0;
        }
    }

    public static double round(double value, int precious){
        try {
            if(! Double.isInfinite(value)) {
                BigDecimal bg = new BigDecimal(value).setScale(precious, RoundingMode.HALF_UP);

                return bg.doubleValue();
            }else{
                return 0.0;
            }
        }catch(Exception exc){
            logger.warn("值=" + value + ", 精度=" + precious, exc);

            return 0.0;
        }
    }

    /**
     * 获取BigDecimal值
     * @param values
     * @return
     */
    public static BigDecimal getBigDecimalValue(String values){
        BigDecimal reValue = new BigDecimal(0.00);
        if(StringUtils.isNullOrBlank(values)){
            return reValue;
        }
        reValue = BigDecimal.valueOf(Double.parseDouble(values));
        return reValue;
    }

    /**
     * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     * 定精度，以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static BigDecimal div(BigDecimal v1,BigDecimal v2,int scale){
        if(scale<0){
            scale = 0;
        }
        return v1.divide(v2,scale,BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 提供减法运算
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static BigDecimal subtract(BigDecimal v1, BigDecimal v2){
        BigDecimal value = new BigDecimal(0.00);
        if( null == v1 || v1.compareTo(value) !=1){
            return value;
        }
        return v1.subtract(v2);
    }


    /**
     * 提供加法运算。
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static BigDecimal add(BigDecimal v1,BigDecimal v2){
        BigDecimal value = v2;
        if( null == v1){
            return value;
        }
        return v1.add(v2);
    }


    /**
     * 提供乘法运算。
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static BigDecimal mul(BigDecimal v1,BigDecimal v2){
        BigDecimal value = new BigDecimal(0.00);
        if( null == v1 || v1.compareTo(value) !=1){
            return value;
        }
        return v1.multiply(v2);
    }

}
